package 校赛.真题._2022校赛;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec
 * 题目描述
 * 地下城是一块n×3(宽为3，高为n)的区域，每块格子都有一个价值。
 * 小A目前在监狱的左上角(1,1)处，而他需要走到地下城的右下角(n,3)处。
 * 小A每次可以向右或者向下移动一格，请问小A走到右下角，其路径价值和大于等于0的不同方法数一共有多少种，
 * 由于答案可能很大，答案对1000000007取模。

 * 输入格式
 * 第一行包含一个正整数n，地下城的高度。
 * 以下n 行每行包含三个值ai1，ai2，ai3，分别代表这一层三个格子的值。

 * 输出格式
 * 输出小A行走路径价值和大于等于0的不同方法数。输出答案对1000000007取模后的结果

 * 数据范围
 * 1 ≤ n≤ 100000,
 * -1000000000 ≤ai1，ai2，ai3 ≤ 1000000000

 * 样例1
 * 输入数据 1
2
0 -1-1
-1 -1 3
 * 输出数据 1
 * 3
 * 样例1解释：
 * 三种路径分别为:
 * （1,1）（1,2）（1,3）（2,3） 结果为1
 * (1,1）（1,2）（2,2）（2,3）结果为1
 * （1,1）（2,1）（2,2）（2,3）结果为1

 * 样例2
 * 输入数据 2
10
0 47-6
-18 4 57
60 70 -18
-98 46 83
97 79 35
-8 92 -41
-15 -59 -65
-10 93 -33
-56 93 9
-73 7 98
 * 输出数据 2
 * 53
 * 时空限制
 * 1s/64MB
 * @since 2023 - 03 - 28 - 19:53
 */
public class I_是男人就下一百层 {
}
class Main_I{
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static String nextLine() throws IOException {
        return reader.readLine();
    }
    static String next() throws IOException {
        if(!tokenizer.hasMoreTokens()){
            tokenizer = new StringTokenizer(nextLine());
        }
        return tokenizer.nextToken();
    }
    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    static int[][] nums;
    static int res, n;
    static int mod = 1000000007;

    public static void main(String[] args) throws IOException {
        n = nextInt();
        nums = new int[n][3];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < 3; j++){
                nums[i][j] = nextInt();
            }
        }
        res = 0;


    }
}
//dfs 超时
class Main_I1{
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static String nextLine() throws IOException {
        return reader.readLine();
    }
    static String next() throws IOException {
        if(!tokenizer.hasMoreTokens()){
            tokenizer = new StringTokenizer(nextLine());
        }
        return tokenizer.nextToken();
    }
    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    static int[][] nums;
    static int res, n;
    static int mod = 1000000007;
    static void dfs(int i, int j, long val){
        val += nums[i][j];
        if(i == n - 1 && j == 2){
            if(val >= 0){
                res = (res + 1) % mod;
            }
            return;
        }
        if(i < n - 1){
            dfs(i + 1, j, val);
        }
        if(j < 2){
            dfs(i, j + 1, val);
        }
    }
    public static void main(String[] args) throws IOException {
        n = nextInt();
        nums = new int[n][3];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < 3; j++){
                nums[i][j] = nextInt();
            }
        }
        res = 0;
        dfs(0, 0, 0);
        System.out.println(res);
    }
}

